﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

using _XNA__RunningDeath.DTO;
using _XNA__RunningDeath.BUS;
using _XNA__RunningDeath.BUS.VatThe;
using _XNA__RunningDeath.GLO;

namespace _XNA__RunningDeath.GUI
{
    class CGUI_RunningDeath:CDiaLogBox
    {
        #region contractor
        Texture2D _texBtnPause;                                         // icon button Pause Game
        Texture2D _texBtnStartGame;                                     // icon button Start Game
        Texture2D _texLife;                                             // icon Life
        
        SoundEffect _soundInSDa;                                        // Âm thanh va chạm với đá
        SoundEffect _soundInSHo;                                        // Âm thanh va chạm với đá
        SoundEffect _soundGameOver;                                     // Âm thanh Game Over
        
        bool isPlaySoundGameOver = false;                               // Đã Play Âm thanh game Over
        bool IsOne = false;                                             // Chạy 1 lần rồi
        bool IsPlaySoundDie = false;                                    // Đã Play âm thanh Die
        
        int LifePrev;                                                   // Mạng Trước khi xử lý
        List<Vector2> mutiLife = new List<Vector2>();                   // Danh Sách các mạng sống còn lại của nhân vật
       
        SpriteFont fontDiem;                                            // Dùng để vẽ điểm
        CBeMatDiChuyen_BUS _beMatDiChuyen;                              // Lớp bề mặt di chuyển
        CGUI_GameOver _guiGameOver;                                     // Lớp giao diện gameOver
        _XNA__RunningDeath.BUS.BUS _KichBan = new BUS.BUS();            // lớp kịch bản cho game

        #endregion

        public CGUI_RunningDeath(ContentManager content, GameTime gameTime, SpriteBatch spriteBatch)
            : base
                (content, gameTime, spriteBatch)
        {
            if (this._content != null)
            {
                this._texBtnPause = this._content.Load<Texture2D>(@"GUI/btnPause");
                this._texBG = this._content.Load<Texture2D>(@"GUI/guiBG");
                this._texBtnStartGame = this._content.Load<Texture2D>(@"GUI/btnStartGame");
                this._texLife = this._content.Load<Texture2D>(@"GUI/life");
                this._dstoado = this._content.Load<Dictionary<string, Rectangle>>(@"GUI/ztoadoXMLgui");

                _soundGameOver = this._content.Load<SoundEffect>(@"AmThanh/soundGameOver");
                _soundInSDa = this._content.Load<SoundEffect>(@"AmThanh/intestHo");
                _soundInSHo = this._content.Load<SoundEffect>(@"AmThanh/intestHo");

                CGLOBAL.NhanVatBus = new CNhanVat_BUS(content, gameTime, spriteBatch);
                CGLOBAL.VTda = new BUS.VatThe.CDa_BUS(content,gameTime,spriteBatch);
                CGLOBAL.MapGame = new CMap_BUS(content, gameTime, spriteBatch);
                _beMatDiChuyen = new CBeMatDiChuyen_BUS(content, gameTime, spriteBatch);
                _guiGameOver = new CGUI_GameOver(content, gameTime, spriteBatch);

                fontDiem = content.Load<SpriteFont>("SpriteFont");

                KhoiTaoThongSoGame();
               // KhoiTaoToaDoMangChoNhanVat();
                MediaPlayer.Play(CGLOBAL._nhacnen);
            }
       }

        public override void Update(GameTime gameTime)
        {
            _KichBan.UpDate(gameTime);

            KhoiTaoToaDoMangChoNhanVat();
            int b = mutiLife.Count;
            if(b >= 5)
            {
                b = 0;
            }
            XuLyKichButton();

            ///Tạo 2 phiếm để kiểm tra mình nhấn phiếm gì (tức là lấy trạng thái phím hiện tại nhấn lưu vào pause và play)
            KeyboardState pause = Keyboard.GetState();
            KeyboardState play = Keyboard.GetState();

           
            //Nêu nhấn nút play (mặc đinh là space) thì sẽ sét trạng thái game là play
            if (play.IsKeyDown(CThamSo.KeyPlay1) || play.IsKeyDown(CThamSo.KeyPlay2))
            {
                CGLOBAL.GamePlay = enumGamePlay.play;
            }

            if(CGLOBAL.GamePlay == enumGamePlay.play)
            {
                UpDateGame(gameTime);
            }

            XuLyVaCham();

            if (CGLOBAL.timevibiGameOver >= CThamSo.timevibiGameOver)
            {
                _guiGameOver.Update(gameTime);
                if (!isPlaySoundGameOver)
                {
                    _soundGameOver.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                    isPlaySoundGameOver = true;
                }
            }

            UpDateLife();

            //Lưu lại trạng thái game
            CGLOBAL.pointBeMat01 = _beMatDiChuyen._posStand1;
            CGLOBAL.pointBeMat02 = _beMatDiChuyen._posStand2;
            CGLOBAL.pointBeMat03 = _beMatDiChuyen._posStand3;
            CGLOBAL._recHo = _beMatDiChuyen._recHo;

            CGLOBAL.pointActor = CGLOBAL.NhanVatBus._pointCurent;
            CGLOBAL.pointDa = CGLOBAL.VTda._toadoXuatHien1;

            //nếu đang chơi nhấn nút pause  thì game sẽ dừng lại và chuyển sang giao diện pause
            if (pause.IsKeyDown(CThamSo.KeyPause))
            {
                CGLOBAL.GamePlay = enumGamePlay.pause;
                CGLOBAL.GUISelected = GUIenum.guiPause;
            }
        }

        public override void Draw(GameTime gameTime)
        {
            this._spriteBatch.Begin();

            CGLOBAL.MapGame.Draw(gameTime);
            CGLOBAL.VTda.Draw(gameTime);
            this._spriteBatch.Draw(this._texBtnStartGame, new Vector2(this._dstoado["btnStarGame"].X, this._dstoado["btnStarGame"].Y), Color.White);
            this._spriteBatch.Draw(this._texBtnPause, new Vector2(this._dstoado["btnPause"].X, this._dstoado["btnPause"].Y), Color.White);

            foreach (Vector2 item in mutiLife)
            {
                this._spriteBatch.Draw(this._texLife, item, Color.White);
            }

            CGLOBAL.NhanVatBus.Draw(gameTime);
            _beMatDiChuyen.Draw(gameTime);

            if (CGLOBAL.timevibiGameOver >= CThamSo.timevibiGameOver)
                _guiGameOver.Draw(gameTime);

            _spriteBatch.DrawString(fontDiem, "Score: " + CGLOBAL.Score, new Vector2(20, 40), Color.Red);


            this._spriteBatch.End();

        }

        #region Khơi Tạo

        private void KhoiTaoThongSoGame()
        {
            if (CGLOBAL.NewGame == enumGame.mNew)
            {
                LifePrev = CGLOBAL.Life = CThamSo.Life;
                CGLOBAL.Score = CThamSo.Score;
                CGLOBAL.speedBeMatDiChuyen = CThamSo.speedAt;
                CGLOBAL.speedChuoi = CThamSo.speedAt;
                CGLOBAL.speedDa = CThamSo.speedAt;
            }

            LifePrev = CGLOBAL.Life;
        }

        private void KhoiTaoToaDoMangChoNhanVat()
        {
            int a = CGLOBAL.Life;

            if(a >= 5)
            {
                 a = 3;
            }
            mutiLife.Clear();
            for (int i = 0; i < CGLOBAL.Life; i++)
            {
                if (i == 0)
                    TaoPosLife(CThamSo._posLife);
                else
                {
                    TaoPosLife(new Vector2(mutiLife[i - 1].X + 40, mutiLife[i - 1].Y));
                }
            }
        }

        #endregion

        #region các hành dộng có trong game
        /// <summary>
        /// Cập nhật lại số mạng còn lại của nhân vật
        /// </summary>
        private void UpDateLife()
        {
            if (CGLOBAL.Life >= 0)
            {
                if (CGLOBAL.Life < LifePrev)
                {
                    mutiLife.RemoveAt(mutiLife.Count - 1);
                    LifePrev = CGLOBAL.Life;
                }
            }
        }

        /// <summary>
        /// Xử lý các sự kiện kích vào các button có trong giao diện
        /// </summary>
        private void XuLyKichButton()
        {
            //sét lại trạng thái chuột đã nhấn trước bằng trạng thái chuột hiện tại sau đó cập nhật trạng thái chuột hiện tại là trạng thái mới
            CGLOBAL.MousePrev = CGLOBAL.MouseCurrent;
            CGLOBAL.MouseCurrent = Mouse.GetState();

            ///Kiểm tra nhấn vào vùng của nút nào trong giao diện game play
            if (CGLOBAL.MouseCurrent.LeftButton == ButtonState.Pressed && CGLOBAL.MousePrev.LeftButton == ButtonState.Released)
            {
                CGLOBAL.GUISelectedPrev = CGLOBAL.GUISelected;
                if (this._dstoado["btnPause"].Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))
                {
                    CGLOBAL.GamePlay = enumGamePlay.pause;  // Dừng Game Lại
                    CGLOBAL.NextGUI = true;                 // Chuyển giao diện lên (khởi tạo giao diện mới) 
                    CGLOBAL.GUISelected = GUIenum.guiPause; // Chuyển đến giao diện pause

                }
                else if (this._dstoado["btnStarGame"].Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))
                {
                    CGLOBAL.GamePlay = enumGamePlay.play;   // nếu vào tiếp tục thì sẽ cho game play bình thường
                }
            }
        }

        /// <summary>
        /// Xử lý các sự cố va chạm trong game
        /// </summary>
        private void XuLyVaCham()
        {
            Rectangle GiuaHo = new Rectangle(_beMatDiChuyen._recHo.X + CThamSo.doLechFrame + 20, _beMatDiChuyen._recHo.Y, _beMatDiChuyen._recHo.Width - CThamSo.doLechFrame - 20, _beMatDiChuyen._recHo.Height);
            if (CGLOBAL.NhanVatBus.recNhanVat.Intersects(GiuaHo))
            {
                if (!CGLOBAL.NhanVatBus.IsDie())
                {
                    CGLOBAL.NhanVatBus.setLost();
                    if(!IsPlaySoundDie)
                    {
                        _soundInSHo.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                        IsPlaySoundDie = true;
                    }
                }
                MediaPlayer.Stop();
            }

            if (CGLOBAL.NhanVatBus.recNhanVat.Intersects(CGLOBAL.VTda._reDa))
            {
                if (!CGLOBAL.NhanVatBus.IsDie())
                {
                    CGLOBAL.NhanVatBus.setDie();
                    _soundInSDa.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                }

                MediaPlayer.Stop();
            }

            if (_beMatDiChuyen._recHo.Intersects(CGLOBAL.VTda._reDa))
            {
                CGLOBAL.VTda.Mat();
            }
        }

        /// <summary>
        /// Cập nhật lại trạng thái game
        /// </summary>
        /// <param name="gameTime"></param>
        private void UpDateGame(GameTime gameTime)
        {
            CGLOBAL.NhanVatBus.Update(gameTime);

            bool IsDie = CGLOBAL.NhanVatBus.IsDie();
            if (!IsDie)
            {
                if (!CGLOBAL.NhanVatBus.IsLost())
                {
                    CGLOBAL.MapGame.Update(gameTime);
                    _beMatDiChuyen.UpDate(gameTime);
                    CGLOBAL.VTda.Update(gameTime);
                }
                //_CChuoi.Update(gameTime);
            }
            else
            {
                if (!IsOne)
                {
                    CGLOBAL.Life -= 1;
                    IsOne = true;
                }
            }
        }

        /// <summary>
        /// Tạo ra tọa độ cho mỗi trái tim (thể hiện mạng sống hiện tại của nhân vật) sau đó add vào list các mạng sống của nhân vật
        /// </summary>
        /// <param name="vitri"></param>
        public void TaoPosLife(Vector2 vitri)
        {
            Vector2 item = vitri;
            mutiLife.Add(item);
        }

        #endregion
    }
}
